/************************************
 * name: reader.h 
 * func: reader driver
 * date: 2015/06/03
 *
 ***********************************/
#ifndef __READER_H__
#define __READER_H__
#include "typedef.h"

#define DEV_NAME                     "/dev/CST-RC500" 
#define SECRTOR_KEY_FACTOR_ASN		 0xB0  // 离散因子 (采用8位序列号)
#define SECRTOR_KEY_FACTOR_UID 		 0xB1  // 离散因子 (物理卡号4+4)
#define APP_LITTLE_ENDIAN            0xB2  // 钱包小端模式
#define APP_BIG_ENDIAN               0xB3  // 钱包大端模式(默认 高字节在前)
#define DEAL_RESULT_MONEY_LESS       0xB4  // 余额不足
#define DEAL_RESULT_NORMAL           0xB5  // 正常结束交易
#define DEAL_RESULT_ABNORMAL         0xB6  // 不正常结束交易
#define DEAL_RESULT_FAIL             0xB7  // 交易失败
#define READER_BUF_SIZ               128

//错误号
#define NO_ERR                       0x00 
#define MALLOC_ERR                   0xE000 //申请内存错误
#define PARA_ERR                     0xE001 //参数错误 
#define RC500_INIT_ERR               0xE002 //RC500初始化失败
#define PSAM_INIT_ERR                0xE003 //PSAM初始化失败

#define FIND_CARD_FAIL               0
#define FIND_CARD_SUCC               1

// 返回值
#define RET_ERR_TYPE                -2
#define RET_ERR_WRITE               -3
#define RET_ERR_READ                -4

// 卡结构
#define NORMAL_CPU_CARD              0xA0 //标准CPU卡
#define X24_CPU_CARD                 0xA1 //国民卡 
#define NORMAL_M1_CARD               0xA2 //标准M1卡
#define X24_M1_CARD                  0xA3 //中科卡

// 读头对象
#define READER_CONTACTLESS_M1        0x01 /* 选择非接M1 */
#define READER_SETTING               0x02 /* 读头设置 */
#define READER_CONTACTLESS_CPU       0x55 /* 选择非接CPU，这么定义是保持兼容老版驱动 */
#define READER_CONTACTLESS_24G		 0xFE /* 选择非触2.4G，这么定义是保持兼容老版驱动 */
#define READER_CONTACT_SAM1		     0xFF /* 选择接触SAM，这么定义是保持兼容老版驱动 */

// 读头操作命令
#define RC500_INIT                   0x10 /* 初始化RC500命令 */
#define RC500_ANTENNA_CONTROL        0x36 /* 天线控制命令 */
#define RC500_FIND_CARD              0x37 /* 寻卡命令 */
#define RC500_ANTI_COLLISION         0x38 /* 防冲突命令 */
#define RC500_SELECT_CARD            0x39 /* 选定/锁定一张卡片 */
#define RC500_HALT_CARD              0x29 /* 休眠卡片命令 */
#define RC500_AUTHENTICATION         0x4A /* mifare one 密钥认证 */
#define RC500_READ_CARD              0x4B /* 读mifare one块信息 */
#define RC500_WRITE_CARD             0x4C /* 写mifare one块信息 */
#define RC500_RST_CPU_CARD           0x54 /* 复位CPU卡 */
#define RC500_DESELECT_CPU_CARD      0x56 /* 退出激活CPU卡 */

//卡类型支持
#define CHINA_UNICOM                 0x01 /* 联通版 支持cpu/M1/国民卡/中科卡 */
#define QUICK_PASS                   0x02 /* 支付闪付卡 */
#define CHINA_TELECOM                0x03 /* 电信版 支持cpu/m1/国民卡/nfc卡 */

//读头类型
#define RC500_MODE                   0x04 /* RC500读头 支持标准cpu/M1卡 */
#define X24_MODE                     0x05 /* 2.4读头 支持国民卡/中科卡 */
#define DOUBLE_MODE                  0x06 /* 双模 */

//PSAM支持
#define PSAM_MODE                    0x07 /* 有PSAM卡 */
#define NOPSAM_MODE                  0x08 /* 无PSAM卡 */

typedef struct {
	u8             deal_type;            // 钱包类型 ED: 0x01 EP:0x02
	u8             deal_val[4];          // 交易值  (大端输入 0x00000064 = 100)
	u8             deal_rebate[4];       // 交易折扣
	u8             deal_time[7];         // 交易时间 xxxx-xx-xx xx-xx-xx 年-月-日 时-分-秒
	u8             deal_pin[3];          // 6位PIN校验码 (圈存时需输入)
	
}cpu_in; // cpu卡交易前输入数据

typedef struct {
	u8             deal_ret;             // 交易结果
	u8             deal_cnt[2];          // 消费交易序号(初始化指令产生)
	u8             deal_index[4];        // 终端交易序号(PSAM 计算mac1产生)
	u8             deal_residue[4];      // 交易前余额
	u8             deal_tac[4];          // TAC
}cpu_out; // cpu卡交易中产生数据


typedef struct {
	cpu_in      in;                  // 输入数据        
	cpu_out     out;                 // 输出数据
}cpu_data; // cpu卡私有数据


typedef struct {
	u8             deal_type;            // 钱包类型 M1:0x01-主钱包, 0x02-补贴钱包 CPU: 01-电子钱包 02-电子存折
	u8             deal_index[4];        // 交易序号
	u8             deal_val[4];          // 交易值     (大端输入 0x00000064 = 100)
	u8             deal_residue[4];      // 交易前余额 (大端输入 0x00000064 = 100)
	u8             deal_rebate[4];       // 交易折扣   (大端输入 0x00000064 = 100)
	u8             deal_time[8];         // 交易时间 
	
}mifare_in; // m1卡交易前输入数据

typedef struct {
	u8             deal_ret;             // 交易结果
	u8             deal_cnt[2];          // 交易累计次数
	u8             deal_tac[4];          // TAC
	
}mifare_out; // m1交易过程后的数据


typedef struct {
	mifare_in      in;                  // 输入数据        
	mifare_out     out;                 // 输出数据
}mifare_data; // M1私有数据


typedef struct {
	u8             factor;               // 离散因子标识 
	u8             endian;               // 交易钱包字节序 
	u8             type;                 // 平台类型
	u8             mode;                 // 单模或双模
	u8             psam;                 // 是否需要PSAM
	u8             terminal[6];          // 端终号(无PSAM需填入终端设备号)
	u8             kkey[16];             // 密钥数据

}platform_data; // 平台数据

typedef  int (* op_handle)(void *, void *);
typedef  int (* op_find)(void *);
typedef  int (* op_exit)(void *); 

typedef  struct {
	union {
		u8 mf_comm; 
		u8 ins;	
	}cmd;	
	union {
		u8 mf_flag;
		u8 p1;	
	}pa1;
	union {
		u8 mf_sector;
		u8 p2;	
	}pa2;
	union {
		u8 mf_len;
		u8 lc;
	}len;	

	u8 cla;
	u8 le;	
	u8 sw1;	
	u8 sw2;	
	u8 type;
	u8 data[READER_BUF_SIZ];
}card_data; // 卡交互信息


typedef  struct {
	u8               card_stat;             // 卡状态
	u8               card_type;             // 卡结构
	s32              fd[2];                 // 设备号 fd[0]:rc500  fd[1]:x24
	
	// 句柄操作函数
	op_exit          exit_op;               // 退出卡操作
	op_find          find_op;               // 寻卡操作
	op_handle 		 cons_op;     			// 消费操作
	op_handle		 load_op;               // 圈存操作

	u8               key_len;               // KEY临时数据长度
	u8               index[4];              // 数据库序号
	u8               terminal[6];           // 终端号
	u8               card_num[8];           // 卡序列号
	u8               key_data[16];          // KEY临时数据
	u8               kkey[16];              // 平台密钥
}reader_op;

extern int 	  DEBUG_APP_WALL; 


// 中国电信翼机通宏定义
//==================================================================================
#define     CCTC_YJD_AID1                       "\xDF\x10"   // 应用目录
#define     CCTC_YJD_AID2                       "\xDF\x11"   // 保留
#define     CTCC_YJD_KEY_NAME                   "ESTM1KEY"   // 密钥数据体
#define 	CTCC_YJD_KEY_FLAG                   0x27         // 密钥标识符 (消费 圈存)
#define     CTCC_YJD_KEY_FLAG_TAC               0x26         // 计算TAC密钥标识符
#define     CTCC_YJD_KEY_ID						0x01         // 密钥索引 (消费 TAC)
#define     CTCC_YJD_KEY_ID_LOAD                0x12         // 圈存密钥索引
#define 	CTCC_YJD_MIFARE_KAY      			"\xA0\xA1\xA2\xA3\xA4\xA5" //认证密钥

// 中国联通一卡通定义
//==================================================================================
#define 	CUCC_YKT_MIFARE_KEY      			"\xFF\xFF\xFF\xFF\xFF\xFF" //认证密钥

//==================================================================================
// 扇区定义
#define     S0B0                                0
#define     S0B1                                1
#define     S0B2                                2
#define     S0B3                                3
#define     S1B0                                4      // 钱包块
#define     S1B1                                5      // 备份钱包块
#define     S1B2                                6
#define     S1B3                                7
#define     S2B0                                8
#define     S2B1                                9
#define     S2B2                                10
#define     S2B3                                11
#define     S3B0                                12
#define     S3B1                                13
#define     S3B2                                14
#define     S3B3                                15
#define     S4B0                                16
#define     S4B1                                17
#define     S4B2                                18
#define     S4B3                                19
#define     S5B0                                20     // 补贴钱包块
#define     S5B1                                21     // 备分补贴钱包块
#define     S5B2                                22
#define     S5B3                                23
#define     S6B0                                24
#define     S6B1                                25
#define     S6B2                                26
#define     S6B3                                27
#define     S7B0                                28
#define     S7B1                                29
#define     S7B2                                30
#define     S7B3                                31
#define     S8B0                                32     // 钱包交易明细
#define     S8B1                                33     // 备份钱包交易
#define     S8B2                                34
#define     S8B3                                35



extern platform_data platform;

reader_op* reader_attr_create(platform_data *data);
s32 reader_attr_destroy(reader_op *reader);

#endif

